home *** CD-ROM | disk | FTP | other *** search
/ SuperHack / SuperHack CD.bin / CODING / DELPHI / D_TAPI.ZIP / CALLFORM.PAS < prev    next >
Encoding:
Pascal/Delphi Source File  |  1996-07-01  |  5.6 KB  |  215 lines

  1. unit Callform;
  2. {
  3.     *** TAPI Monitor ***
  4.     by Davide Moretti <dmoretti@iper.net>
  5.  
  6.     This is a TAPI Test
  7.     It uses TAPI interface to place outgoing calls.
  8.     You can also monitor these calls with the Monitor...
  9. }
  10.  
  11. interface
  12.  
  13. uses
  14.     SysUtils, WinTypes, WinProcs, Messages, Classes, Graphics, Controls,
  15.     Forms, Dialogs, StdCtrls, Tapi, ExtCtrls;
  16.  
  17. type
  18.     TfrmTAPICall = class(TForm)
  19.     Label1: TLabel;
  20.         Edit1: TEdit;
  21.         btnCall: TButton;
  22.     Memo1: TMemo;
  23.         btnDropCall: TButton;
  24.     grpMode: TRadioGroup;
  25.         procedure FormCreate(Sender: TObject);
  26.         procedure FormDestroy(Sender: TObject);
  27.     procedure FormClose(Sender: TObject; var Action: TCloseAction);
  28.     procedure btnCallClick(Sender: TObject);
  29.     procedure btnDropCallClick(Sender: TObject);
  30.     procedure grpModeClick(Sender: TObject);
  31.     private
  32.         { Private declarations }
  33.         lineApp: THLineApp;
  34.         line: THLine;
  35.         call: THCall;
  36.         CallParams: TlineCallParams;
  37.     public
  38.         { Public declarations }
  39.     end;
  40.  
  41. var
  42.     frmTAPICall: TfrmTAPICall;
  43.  
  44. implementation
  45.  
  46. {$R *.DFM}
  47.  
  48. uses Main;
  49.  
  50. var
  51.     buf:array[0..1023] of char;
  52.     callinfo: TLineCallInfo absolute buf;
  53.     {
  54.         these two variables points to the same address.
  55.         since lineGetCallInfo expects a buffer with a TLineCallInfo on top.
  56.     }
  57.  
  58. {
  59.     TAPI Callback procedure: called for TAPI messages
  60.     you MUST use 'stdcall' since it is called by Windows
  61. }
  62. procedure lineCallback(hDevice, dwMsg, dwCallbackInstance,
  63.         dwParam1, dwParam2, dwParam3: LongInt);
  64. {$IFDEF WIN32}
  65.         stdcall;
  66. {$ELSE}
  67.         export;
  68. {$ENDIF}
  69.     var
  70.         s: string;
  71.         hCall: THCall;
  72.     begin
  73.     if dwMsg = LINE_REPLY then { result of LineMakeCall }
  74.         if dwParam2 < 0 then
  75.             frmTAPICall.Memo1.Lines.Add('Reply error')
  76.         else
  77.             frmTAPICall.Memo1.Lines.Add('LINE_REPLY ok')
  78.     else if dwMsg = LINE_CALLSTATE then    { change in line state }
  79.         begin
  80.         hCall := THCall(hDevice);
  81.         case dwParam1 of
  82.             LINECALLSTATE_IDLE:        { call terminated }
  83.                 if hcall <> 0 then
  84.                     begin
  85.                     lineDeallocateCall(hCall);    { you must deallocate the call }
  86.                     frmTAPICall.Memo1.Lines.Add('Idle - call deallocated');
  87.                     frmTAPICall.btnCall.Enabled := True;
  88.                     frmTAPICall.btnDropCall.Enabled := False;
  89.                     end;
  90.             LINECALLSTATE_CONNECTED:    { Service connected }
  91.                 if hCall <> 0 then
  92.                     begin
  93.                     s := 'Connected: ';
  94.                     callinfo.dwTotalSize := 1024;
  95.                     if lineGetCallInfo(hCall, callinfo) = 0 then
  96.                         if callinfo.dwAppNameSize > 0 then
  97. {$IFDEF WIN32}
  98.                             s := s + (buf + callinfo.dwAppNameOffset); { this is more C-ish... }
  99. {$ELSE}
  100.                             s := s + StrPas((buf + callinfo.dwAppNameOffset)); { this is more C-ish... }
  101. {$ENDIF}
  102.                     frmTAPICall.Memo1.Lines.Add(s);
  103.                     end;
  104.             LINECALLSTATE_PROCEEDING:        { call proceeding (dialing) }
  105.                 frmTAPICall.Memo1.Lines.Add('Proceeding');
  106.             LINECALLSTATE_DIALING:            { dialing }
  107.                 frmTAPICall.Memo1.Lines.Add('Dialing');
  108.             LINECALLSTATE_DISCONNECTED:    { disconnected }
  109.                 begin
  110.                 s := 'Disconnected: ';
  111.                 if dwParam2 = LINEDISCONNECTMODE_NORMAL then
  112.                     s := s + 'normal'
  113.                 else if dwParam2 = LINEDISCONNECTMODE_BUSY then
  114.                     s := s + 'busy';
  115.                 frmTAPICall.Memo1.Lines.Add(s);
  116.                 frmTAPICall.btnDropCall.Click;
  117.                 end;
  118.             LINECALLSTATE_BUSY: { busy }
  119.                 frmTAPICall.Memo1.Lines.Add('Busy');
  120.             end;
  121.         end;
  122.     end;
  123.  
  124. procedure TfrmTAPICall.FormCreate(Sender: TObject);
  125.     var
  126.         nDevs, tapiVersion: Longint;
  127.         extid: TLineExtensionID;
  128.     begin
  129.     { Initialize TAPI }
  130.     { Zeros CallParams structure }
  131.     FillChar(CallParams, sizeof(CallParams), 0);
  132.     with CallParams do
  133.         begin
  134.         dwTotalSize := sizeof(CallParams);
  135.         dwBearerMode := LINEBEARERMODE_VOICE;
  136.         dwMediaMode := LINEMEDIAMODE_INTERACTIVEVOICE;
  137. {        dwMediaMode := LINEMEDIAMODE_DATAMODEM;}
  138.         { if you don't want the dialing dialog use LINEMEDIAMODE_DATAMODEM }
  139.         end;
  140.     if lineInitialize(lineApp, HInstance,
  141.             @lineCallback, nil, nDevs) < 0 then        { < 0 is an error }
  142.         lineApp := 0
  143.     else if nDevs = 0 then        { no TAPI devices?? }
  144.         begin
  145.         lineShutDown(lineApp);
  146.         lineApp := 0;
  147.         end
  148.     else if lineNegotiateAPIVersion(lineApp, 0, $00010000, $10000000,
  149.             tapiVersion, extid) < 0 then    { Check for version (copied from a TAPI sample) }
  150.         begin
  151.         lineShutDown(lineApp);
  152.         lineApp := 0;
  153.         end
  154.     { Open a line for outbound calls (here I use first device, normally the modem) }
  155.     else if lineOpen(lineApp, LINEMAPPER, line, tapiVersion, 0, 0,
  156.             LINECALLPRIVILEGE_NONE, 0, CallParams) < 0 then
  157.         begin
  158.         lineShutDown(lineApp);
  159.         lineApp := 0;
  160.         line := 0;
  161.         end;
  162.     if line = 0 then
  163.         Memo1.Lines.Add('Error!!');
  164.     end;
  165.  
  166. procedure TfrmTAPICall.FormDestroy(Sender: TObject);
  167.     begin
  168.     { Terminate TAPI }
  169.     if line <> 0 then
  170.         lineClose(line);
  171.     if lineApp <> 0 then
  172.         lineShutDown(lineApp);
  173.     frmMain.Call := False;
  174.     end;
  175.  
  176. procedure TfrmTAPICall.FormClose(Sender: TObject;
  177.         var Action: TCloseAction);
  178.     begin
  179.     Action := caFree;
  180.     end;
  181.  
  182. procedure TfrmTAPICall.btnCallClick(Sender: TObject);
  183.     var
  184.         c: array[0..30] of char;
  185.     begin
  186.     if Length(Edit1.Text) > 0 then
  187.         begin
  188.         Memo1.Lines.Clear;
  189.         StrPCopy(c, Edit1.Text);
  190.         if lineMakeCall(line, call, c, 0, CallParams) < 0 then
  191.             Memo1.Lines.Add('Error in lineMakeCall')
  192.         else
  193.             begin
  194.             btnCall.Enabled := False;
  195.             btnDropCall.Enabled := True;
  196.             end;
  197.         end;
  198.     end;
  199.  
  200. procedure TfrmTAPICall.btnDropCallClick(Sender: TObject);
  201.     begin
  202.     if LineDrop(call, nil, 0) < 0 then
  203.         Memo1.Lines.Add('Error in lineDrop')
  204.     end;
  205.  
  206. procedure TfrmTAPICall.grpModeClick(Sender: TObject);
  207.     begin
  208.     if grpMode.ItemIndex = 0 then
  209.         CallParams.dwMediaMode := LINEMEDIAMODE_INTERACTIVEVOICE
  210.     else
  211.         CallParams.dwMediaMode := LINEMEDIAMODE_DATAMODEM;
  212.     end;
  213.  
  214. end.
  215.